package com.study.others;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;

import org.junit.Test;

/**
* @Name: RandomAccessFileDemo
* @Description: 随机访问文件类测试
* 说明：
* 	RandomAccessFile：随机访问文件类，不属于流，是Object的子类，但是它融合了InputStream和OutputStream的功能
* 					   支持对文件随机访问的读取和写入。
* 	API说明：	此类的实例支持对随机访问文件的读取和写入。随机访问文件的行为类似存储在文件系统中的一个大型 byte 数组。
* 		   	存在指向该隐含数组的光标或索引，称为文件指针；输入操作从文件指针开始读取字节，并随着对字节的读取而前移此文件指针。
* 			如果随机访问文件以读取/写入模式创建，则输出操作也可用；输出操作从文件指针开始写入字节，并随着对字节的写入而前移此文件指针。
* 			写入隐含数组的当前末尾之后的输出操作导致该数组扩展。该文件指针可以通过 getFilePointer 方法读取，并通过 seek 方法设置。 
* 	构造：
* 		RandomAccessFile(File file, String mode) 创建从中读取和向其中写入（可选）的随机访问文件流，该文件由 File 参数指定。
* 			参数：File file：file对象
* 				String mode：打开文件的访问模式，四种
* 					"r" 	以只读方式打开。 
* 					"rw" 	打开以便读取和写入。如果该文件尚不存在，则尝试创建该文件。  （常用）
* 					"rws"、"rwd" 。
* 	常用方法：
* 		读方法：类似io流；
* 		写方法：类似io流；
* 		long getFilePointer()  返回此文件中的当前偏移量。
* 		void seek(long pos)  设置到此文件开头测量到的文件指针偏移量，在该位置发生下一个读取或写入操作。
* @Author: 李超	lc_jack@foxmail.com
* @CreateDate: 2017-1-16 下午9:46:51 
* @Version: V1.0
 */
public class RandomAccessFileDemo {
	
	/**
	* @Name: write
	* @Description: 使用随机访问文件类向指定文件中写数据
	* @Author: 李超	lc_jack@foxmail.com
	* @Version: V1.0
	* @CreateDate: 2017-1-16 下午9:54:21
	* @Parameters: 
	* @Return: void
	 */
	@Test
	public void write() throws IOException {
		//创建随机访问文件对象
		RandomAccessFile raf = new RandomAccessFile("random.txt", "rw") ;
		//写数据
		raf.writeInt(20) ;
		raf.writeChar('a') ;
		raf.writeBoolean(true) ;
		raf.writeUTF("中国") ;
		//释放资源
		raf.close() ;
	}
	
	/**
	* @Name: read
	* @Description: 使用随机访问文件类从指定文件中读取数据
	* @Author: 李超	lc_jack@foxmail.com
	* @Version: V1.0
	* @CreateDate: 2017-1-16 下午9:54:49
	* @Parameters: 
	* @Return: void
	 */
	@Test
	public void read() throws IOException {
		//创建随机访问文件对象
		RandomAccessFile raf = new RandomAccessFile("random.txt", "rw") ;
		//读数据
		raf.seek(0) ; //设置文件指针位置
		int i = raf.readInt() ;
		System.out.println(i + "，文件指针位置为：" + raf.getFilePointer());
		char c = raf.readChar() ;
		System.out.println(c + "，文件指针位置为：" + raf.getFilePointer());
		boolean b = raf.readBoolean() ;
		System.out.println(b + "，文件指针位置为：" + raf.getFilePointer());
		String s = raf.readUTF() ;
		System.out.println(s + "，文件指针位置为：" + raf.getFilePointer());
		//释放资源
		raf.close() ;
	}
	
	
}


















